// 云函数入口文件
const cloud = require('wx-server-sdk')

cloud.init()

const TcbRouter = require('tcb-router')

const db = cloud.database()
const blogCollection = db.collection("blog")

const MAX_LIMIT = 100

// 云函数入口函数
exports.main = async(event, context) => {
  const app = new TcbRouter({
    event
  })

  app.router('list', async(ctx, next) => {
    // 设置模糊搜索
    const keyword = event.keyword
    let w = {}
    if (keyword.trim() != '') {
      w = {
        content: db.RegExp({
          regexp: keyword,
          options: 'i'
        })
      }
    }

    ctx.body = await blogCollection
      .where(w)
      .skip(event.start)
      .limit(event.count)
      .orderBy('createTime', 'desc')
      .get()
      .then((res) => {
        return res.data
      })
  })

  // 暂时不支持多集合联合查询
  app.router('detail', async(ctx, next) => {
    let blogId = event.blogId
    // 详情查询
    let detail = await blogCollection
      .where({
        _id: blogId
      })
      .get()
      .then((res) => {
        return res.data
      })

    // 评论查询
    const countResult = await blogCollection.count() // 查询的总数
    const total = countResult.total
    // 评论的结果
    let commentList = {
      data: []
    }

    if (total > 0) {
      // 计算出通过几次把结果查询到
      const batchTimes = Math.ceil(total / MAX_LIMIT)
      const tasks = []
      for (let i = 0; i < batchTimes; i++) {
        let promise = db.collection('blog-comment').skip(i * MAX_LIMIT)
          .limit(MAX_LIMIT)
          .where({
            blogId
          })
          .orderBy('createTime', 'desc')
          .get()
        tasks.push(promise)
      }
      if (tasks.length > 0) {
        // 把结果累加到当前的结果上
        commentList = (await Promise.all(tasks)).reduce((acc, cur) => {
          return {
            data: acc.data.concat(cur.data)
          }
        })
      }
    }

    ctx.body = {
      detail,
      commentList
    }

  })



  const wxContext = cloud.getWXContext()
  app.router('getListByOpenid', async(ctx, next) => {
    ctx.body = await blogCollection.where({
      _openid: wxContext.OPENID
      })
      .skip(event.start)
      .limit(event.count)
      .orderBy('createTime', "desc")
      .get()
      .then((res) => {
        return res.data
      })
  })

  return app.serve()
}